#include "ModuleResize.h"

void ModuleResize::init(QCVModuleHandlerInterface * parent)
{
	this->parent=parent;
	win=new QWidget();
  layout=new QVBoxLayout(win);
	QHBoxLayout * hlayout=new QHBoxLayout();
	QHBoxLayout * hlayout2=new QHBoxLayout();

	rb_modeFixe=new QRadioButton(tr("Mode fixe"),win);
	rb_modeImage=new QRadioButton(tr("Mode image"),win);
	sb_width=new QSpinBox(win);
	sb_width->setPrefix("W=");
	sb_width->setRange(1,65536);
	sb_height=new QSpinBox(win);
	sb_height->setPrefix("H=");
	sb_height->setRange(1,65536);

	cb_methode=new QComboBox(win);
	cb_methode->addItem("INTER_NEAREST");
	cb_methode->addItem("INTER_LINEAR");
	cb_methode->addItem("INTER_AREA");
	cb_methode->addItem("INTER_CUBIC");
	cb_methode->addItem("INTER_LANCZOS4");

	hlayout->addWidget(rb_modeFixe);
	hlayout->addWidget(rb_modeImage);
	hlayout2->addWidget(sb_width);
	hlayout2->addWidget(sb_height);

	layout->addLayout(hlayout);
	layout->addLayout(hlayout2);
	layout->addWidget(cb_methode);

	connect(rb_modeFixe,SIGNAL(clicked()),this,SLOT(modeChanged()));
	connect(rb_modeImage,SIGNAL(clicked()),this,SLOT(modeChanged()));
	
	rb_modeImage->setChecked(true);
	sb_width->setEnabled(false);
	sb_height->setEnabled(false);
}
////////////////////////////////////////////////////////////////////////////////
void ModuleResize::free()
{
	delete win;
}
////////////////////////////////////////////////////////////////////////////////
cv::Mat & ModuleResize::process()
{
	if(rb_modeImage->isChecked())
	{
		cv::resize(img1,result,img2.size(),0,0,cv::INTER_NEAREST+cb_methode->currentIndex());
	}
	else
	{
		cv::resize(img1,result,cv::Size(sb_width->value(),sb_height->value()),0,0,cv::INTER_NEAREST+cb_methode->currentIndex());
	}
	return result;
}
////////////////////////////////////////////////////////////////////////////////
void ModuleResize::setInput(int n,const cv::Mat & m)
{
	if(n==0)
	{	
		img1=m.clone();
	}
	else if(n==1)
	{	
		img2=m.clone();
	}
}
////////////////////////////////////////////////////////////////////////////////
QWidget* ModuleResize::widget()
{
	return win;
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleResize::getName()
{
	return tr("Redimmensionner");
}
////////////////////////////////////////////////////////////////////////////////
int ModuleResize::nbInputs()
{
	return 1+rb_modeImage->isChecked();
}
////////////////////////////////////////////////////////////////////////////////
bool ModuleResize::setParams(QString params)
{
	QStringList list_params=params.split(";");
		
	if(list_params.size()==1)
	{
		return true;
	}
	else
	{
		return false;
	}	
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleResize::getParams()
{
	return tr("no_param");
}

////////////////////////////////////////////////////////////////////////////////
QCVModuleInterface * ModuleResize::clone()
{
	return new ModuleResize;
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleResize::help(int id)
{
	if(id==-2)
	{
		return trUtf8("Permet de redimentionner une image\n")+
					 trUtf8("\n")+
					 trUtf8("INTER_NEAREST nearest-neighbor interpolation\n")+
					 trUtf8("INTER_LINEAR bilinear interpolation (used by default)\n")+
					 trUtf8("INTER_AREA resampling using pixel area relation. It may be the preferred method for image decimation, as it gives moire-free results.\n")+
					 trUtf8("INTER_CUBIC bicubic interpolation over 4x4 pixel neighborhood\n")+
					 trUtf8("INTER_LANCZOS4 Lanczos interpolation over 8x8 pixel neighborhood\n");
	}
	else if(id==-1)
	{
		return tr("image");
	}
	else if(id==0)
	{
		return tr("image");
	}
	else if(id==1)
	{
		return tr("image");
	}
	else
	{
		return tr("erreur");
	}
}
////////////////////////////////////////////////////////////////////////////////
void ModuleResize::modeChanged()
{
	if(rb_modeFixe->isChecked())
	{
		sb_width->setEnabled(true);
		sb_height->setEnabled(true);
	}
	else
	{
		sb_width->setEnabled(false);
		sb_height->setEnabled(false);
	}
}

Q_EXPORT_PLUGIN2(ModuleResize_plugin,ModuleResize);  
